#include "RenderUtils.h"


// abstract class
// bug, lizard, crab, etc are kinematic objects
// they have similar interface but details different
class KinematicObject
{
public:
	KinematicObject();
	~KinematicObject();

	// the function to call when drawing.
	// kinematic objects implement this in different
	// ways, possible with extra helper functions, but
	// this is the main entry point to keep it standard
	virtual void DrawSelf() = 0;
	
	// get number of 'limbs', where a limb is anything 
	// with a transformation other than the base body R and T
	virtual int GetNumLimbs() = 0;
	
	// print to screen information regarding which 
	// parameters are in a chain vs. which are independent
	virtual void DisplayParamDependency() = 0; 

	//virtual DependencyGraph GetParamDependencyGraph();
	
	// query the model as to what the params are now
	virtual void GetParams( vector<float>& outParams) = 0;

	// set the parameters, they will be used in the next
	// call to DrawSelf();
	virtual void SetParams( const vector<float>& inParams) = 0;
	
private:
	virtual void Light() = 0; // create scene lighting

private:	
	vector<float> m_vfParams; // top level container for 'all parameters'
	
	// a data structure that contains information about which
	// parameters are dependent on one another. For example
	// if a joint angle depends on rotation, they need to be jointly optimized
	// but perhaps they are independent of another joint.
	//DependencyGraph depGraph;
};
